package model

type ClassifyType struct {
	ClassifyId   int    `json:"classify_id"`
	ClassifyName string `json:"classify_name"`
}

type ProductModel struct {
	BaseModel
	OpenId        string   `json:"open_id"`                       //用户Id
	Title         string   `json:"title"`                         //商品标题
	Description   string   `json:"description"`                   //商品描述
	Price         string   `json:"price"`                         //价格
	ProductType   string   `json:"product_type"`                  //商品类型
	Images        []string `json:"images" gorm:"serializer:json"` // 自动 JSON 序列化/反序列化
	ProductPurity string   `json:"product_purity"`                //商品成色
	TradeMethods  string   `json:"trade_methods"`                 //交易方式
	Address       string   `json:"address"`                       //发货地址
	Status        int      `json:"status"`
	//CreatedAt     string   `json:"created_at"`
	//UpdatedAt     string   `json:"updated_at"`
}

func CreateProductFactory(sqlType string) *ProductModel {
	return &ProductModel{BaseModel: BaseModel{DB: UseDbConn(sqlType)}}
}

func (ProductModel) TableName() string {
	return "tb_product"
}

// 获取全部的商品
/*func (p *ProductModel) GetProducts(limit int, lastID int, productType string) ([]ProductModel, error) {
	var products []ProductModel
	query := p.DB.Table("tb_product").
		Where("status = 1"). // 只查 status=1 的记录
		Order("id DESC")     // 按 ID 倒序

	// 人工 productType 不是空的话添加为查询条件
	if productType != "" {
		query = query.Where("product_type = ?", productType)
	}
	// 如果 lastID > 0，添加 WHERE 条件避免重复
	if lastID > 0 {
		query = query.Where("id < ?", lastID)
	}

	// 执行查询
	err := query.Limit(limit).Find(&products).Error
	return products, err
}*/

// 定义一个结构体，包含商品信息和用户头像
type ProductWithAvatar struct {
	ProductModel
	AvatarUrl string `json:"avatar_url"` // 用户头像
}

func (p *ProductModel) GetProducts(limit int, lastID int, productType string) ([]ProductWithAvatar, error) {
	var products []ProductWithAvatar
	query := p.DB.Table("tb_product").
		Select("tb_product.*, tb_user.avatar_url").                         // 选择商品字段和用户头像
		Joins("LEFT JOIN tb_user ON tb_product.open_id = tb_user.open_id"). // 关联用户表
		Where("tb_product.status = ?", 1).                                  // 只查 status=1 的记录
		Order("tb_product.id DESC")                                         // 按 ID 倒序

	// 如果指定了商品类型，则添加查询条件
	if productType != "" {
		query = query.Where("tb_product.product_type = ?", productType)
	}

	// 如果 lastID > 0，添加 WHERE 条件避免重复
	if lastID > 0 {
		query = query.Where("tb_product.id < ?", lastID)
	}

	// 执行查询
	err := query.Limit(limit).Find(&products).Error
	return products, err
}

// 获取全部商品的类型
func (p *ProductModel) GetClassifyType() ([]ClassifyType, error) {
	var productType []ClassifyType
	err := p.DB.Table("tb_classify").Find(&productType).Error
	return productType, err
}

// 插入商品
func (p *ProductModel) InsertProduct(product ProductModel) error {
	err := p.DB.Table("tb_product").Create(&product).Error
	return err
}

// 通过OpenId获取指定用户发布的商品
func (p *ProductModel) GetProductByOpenId(openId string) ([]map[string]interface{}, error) {
	var products []ProductModel
	var result []map[string]interface{}

	// Step 1: 根据 open_id 查询商品列表
	if err := p.DB.Where("open_id = ?", openId).Find(&products).Error; err != nil {
		return nil, err
	}

	// Step 2: 遍历每个商品，查询对应的所有订单信息，并组合返回
	for _, product := range products {
		var orders Order

		// 根据商品ID查询所有与该商品相关的订单
		if err := p.DB.Where("product_id = ?", product.Id).Find(&orders).Error; err != nil {
			return nil, err
		}

		// 将商品和订单信息组合成 map 返回
		result = append(result, map[string]interface{}{
			"product": product,
			"order":   orders,
		})
	}

	return result, nil
}

// 根据商品id查询出商品的卖家和发布地址以及金额
func (p *ProductModel) GetProductById(id string) interface{} {
	var product ProductModel
	p.DB.Table("tb_product").Where("id = ?", id).Find(&product)
	return map[string]interface{}{
		"seller_open_id": product.OpenId,
		"address":        product.Address,
		"price":          product.Price,
	}
}

func (p *ProductModel) UpdateProductStatus(id string, i int) {
	p.DB.Table("tb_product").Where("id = ?", id).Update("status", i)
}

func (p ProductModel) UpdatePrice(id string, price string) {
	//根据商品id修改价格
	p.DB.Table("tb_product").Where("id = ?", id).Update("price", price)
}

func (p ProductModel) QueryProductStatus(id string) interface{} {
	var product ProductModel
	p.DB.Table("tb_product").Where("id = ?", id).Find(&product)
	return map[string]interface{}{
		"status": product.Status,
	}
}

// 查询商品信息
//
//	func (p ProductModel) SearchProduct(keyWord string) interface{} {
//		//根据keyWord去模糊查询商品的标题或者描述或者类型，将查询出来的结果返回
//		var products []ProductModel
//		p.DB.Table("tb_product").Where("title LIKE ? OR description LIKE ? OR product_type LIKE ?", "%"+keyWord+"%", "%"+keyWord+"%", "%"+keyWord+"%").Find(&products)
//		return products
//	}
func (p ProductModel) SearchProduct(keyWord string) interface{} {
	var products []ProductWithAvatar

	p.DB.Table("tb_product").
		Select("tb_product.*, tb_user.avatar_url").
		Joins("LEFT JOIN tb_user ON tb_product.open_id = tb_user.open_id").
		Where("title LIKE ? OR description LIKE ? OR product_type LIKE ?",
			"%"+keyWord+"%",
			"%"+keyWord+"%",
			"%"+keyWord+"%").
		Find(&products)

	return products
}
